import axios from 'axios'
import { Loading } from 'element-ui'
import router from '@/router'
import store from '@/store/index'
import { message } from './resetMessage'
let loading
// 创建一个axios实例
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API,
  timeout: 1000000
})

// 请求拦截器
const time = 100000000000 // 有效时长1天
service.interceptors.request.use(config => {
  // Do something before request is sent
  // 设置token有效时长
  // 加载动画
  loading = Loading.service({
    lock: true,
    text: 'Loading',
    spinner: 'el-icon-loading',
    background: 'rgba(0, 0, 0, 0.7)'
  })
  // 获取token
  const token = store.state.user.token
  // 设置请求头

  if (token) {
    // 注意：Bearer后面一定要有空格
    if (config.url !== '/auth/local/register') {
      config.headers.Authorization = 'Bearer ' + token
    }

    // 再次获取最新时间戳
    const curTime = Date.now()
    const loginTime = localStorage.getItem('loginTime')
    if ((curTime - loginTime) > time) {
      // token过期了  --
      // 退出登录
      store.dispatch('user/loginOut')
      // 跳转到登录页面
      router.push('/login')
      // 返回一个错误信息 -- 阻止请求的执行
      // 添加 new Error 的目的：为了 统一再响应拦截器显示错误信息
      // Error会把错误信息包装成一个错误对象，并把传入的错误描述赋值给
      // 错误对象中的message属性
      return Promise.reject(new Error('token过期了，--- 前端设置'))
    }
  }
  return config
}, error => {
  loading.close()
  // Do something with request error
  return Promise.reject(error)
})

// 响应拦截器
service.interceptors.response.use(response => {
// Do something before response is sent
  loading.close()

  if (response.status === 200) {
    message({
      message: response.statusText,
      type: 'success',
      center: true
    })
  }

  return response
}, error => {
  if (error.response.data.statusCode === 400) {
    message({
      message: `${error.response.data.data[0].messages[0].id}`,
      // message: '用户名或者邮箱已被注册',
      type: 'error'
    })
  }
  loading.close()
  // Do something with response error
  return Promise.reject(error)
})

export default service
